'use strict';

/**
 * 默认 - controller
 */

const { Controller } = require('egg');
const url = require('url');
const auth = require('../constant/auth_interface');

class ProductController extends Controller {
  async show() {
    const { ctx } = this;
    const M = url.parse(ctx.originalUrl).pathname.split('/')[3];
    const Model = M[0].toUpperCase() + M.slice(1);

    if (auth[M] && auth[M].show === false) {
      return ctx.notFound();
    }

    ctx.logger.info('**********根据ID获取数据**********');
    try {
      const result = await ctx.model[Model]
        .findOne({ _id: ctx.params.id });

      result = await ctx.helper.PopulateResult(ctx.populate, M, result)

      ctx.success(result);

    } catch (err) {
      ctx.logger.error(err);
      ctx.error(err);
    }
  }

  async index() {

    const { ctx, app } = this;
    const M = url.parse(ctx.originalUrl).pathname.split('/')[3];
    const Model = M[0].toUpperCase() + M.slice(1);

    if (auth[M] && auth[M].index === false) {
      return ctx.notFound();
    }

    ctx.logger.info('**********获取列表数据**********');
    try {

      let result = ctx.model[Model]
        .find(ctx.query.cond ? JSON.parse(ctx.query.cond) : {})
        .limit(parseInt(ctx.query.size || 10))
        .skip(parseInt(ctx.query.size || 10) * (parseInt(ctx.query.page || 1) - 1))
        .sort(ctx.query.sort || '-update_time -create_time');

      result = await ctx.helper.PopulateResult(ctx.populate, M, result)

      const count = await ctx.model[Model]
        .count(ctx.query.cond ? JSON.parse(ctx.query.cond) : {});

      ctx.success({
        list: result,
        cond: ctx.query.cond || '',
        size: parseInt(ctx.query.size) || 10,
        page: parseInt(ctx.query.page) || 1,
        sort: ctx.query.sort || '-update_time -create_time',
        total: count,
      });

    } catch (err) {
      ctx.logger.error(err);
      ctx.error(err);
    }
  }
  async create() {
    const { ctx, app } = this;
    const M = url.parse(ctx.originalUrl).pathname.split('/')[3];
    const Model = M[0].toUpperCase() + M.slice(1);

    if (auth[M] && auth[M].create === false) {
      return ctx.notFound();
    }
    console.log(ctx.originalUrl);

    ctx.logger.info('**********增加数据**********');
    try {
      const Modal = new ctx.model[Model](ctx.request.body);

      const result = await Modal.save();

      ctx.logger.info(result);

      ctx.success(result);

    } catch (err) {
      ctx.logger.error(err);
      ctx.error(err);
    }
  }

  async update() {
    const { ctx } = this;
    const M = url.parse(ctx.originalUrl).pathname.split('/')[3];
    const Model = M[0].toUpperCase() + M.slice(1);

    if (auth[M] && auth[M].update === false) {
      return ctx.notFound();
    }

    ctx.logger.info('**********更新数据**********');
    try {
      const result = await ctx.model[Model]
        .update({ _id: ctx.params.id }, ctx.request.body);

      ctx.success(result);

    } catch (err) {
      ctx.logger.error(err);
      ctx.error(err);
    }
  }

  async destroy() {
    const { ctx } = this;
    const M = url.parse(ctx.originalUrl).pathname.split('/')[3];
    const Model = M[0].toUpperCase() + M.slice(1);

    if (auth[M] && auth[M].destroy === false) {
      return ctx.notFound();
    }

    ctx.logger.info('**********删除数据**********');
    try {
      const result = await ctx.model[Model].remove({ _id: ctx.params.id });

      ctx.success(result);

    } catch (err) {
      ctx.logger.error(err);
      ctx.error(err);

    }
  }
}

module.exports = ProductController;
